<?php

namespace Common\Api;

class QQConnect{

    /**
    *
    * 获取QQconnect Login 跳转到的地址值
    *
    * @return array 返回包含code state
    *
    * 
    */ 

 public function login($app_id, $callback, $scope){

        $_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection

        $login_url = "https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=" 

            .$app_id. "&redirect_uri=" . urlencode($callback)

            . "&state=" . $_SESSION['state']

            . "&scope=".urlencode($scope);

//显示出登录地址

         header('Location:'.$login_url);

    }

    /**
    *
    * 获取access_token值
    *
    * @return array 返回包含access_token,过期时间的数组
    *
    */

private function get_token($app_id,$app_key,$code,$callback,$state){

        if($state !== $_SESSION['state']){

return false;

exit();

        }

           $url = "https://graph.qq.com/oauth2.0/token";

            $param = array(

                "grant_type"    =>    "authorization_code",

                "client_id"     =>    $app_id,

                "client_secret" =>    $app_key,

                "code"          =>    $code,

                "state"         =>    $state,

                "redirect_uri"  =>    $callback

            );

            $response = $this->get_url($url, $param);

            if($response == false) {

                return false;

            }

            $params = array();

            parse_str($response, $params);

            return $params["access_token"];

}

     

    /**
    *
    * 获取client_id 和 openid
    *
    * @param $access_token access_token验证码
    *
    * @return array 返回包含 openid的数组
    *
    */

    private  function get_openid($access_token) {

        $url = "https://graph.qq.com/oauth2.0/me"; 

        $param = array(

            "access_token"    => $access_token

        );

        $response  = $this->get_url($url, $param);

        if($response == false) {

            return false;

        }

        if (strpos($response, "callback") !== false) {

            $lpos = strpos($response, "(");

            $rpos = strrpos($response, ")");

            $response  = substr($response, $lpos + 1, $rpos - $lpos -1);

        }

        $user = json_decode($response);

        if (isset($user->error) || $user->openid == "") {

            return false;

        }

        return $user->openid;

    }

    /**
    *
    * 获取用户信息
    *
    * @param $client_id
    *
    * @param $access_token
    *
    * @param $openid
    *
    * @return array 用户的信息数组
    *
    */

    public function get_user_info($app_id,$token,$openid){

$url = 'https://graph.qq.com/user/get_user_info?oauth_consumer_key='.$app_id.'&access_token='.$token.'&openid='.$openid.'&format=json';

        $str = $this->get_url($url);

        if($str == false) {

        return false;

        }

        $arr = json_decode($str,true);

        return $arr;

}

 

    /**
    *
    * 请求URL地址，返回callback得到返回字符串
    *
    * @param $url qq提供的api接口地址
    *
    */

    

    public function callback($app_id, $app_key, $callback) {

        $code = $_GET['code'];

        $state = $_GET['state'];

        $token = $this->get_token($app_id,$app_key,$code,$callback,$state);

        $openid = $this->get_openid($token);

        if(!$token || !$openid) {

        return false;

        exit();

        }

           return array('openid' => $openid, 'token' => $token);

    }

    

    

    /*

     * HTTP GET Request

    */

    private  function get_url($url, $param = null) {

    if($param != null) {

    $query = http_build_query($param);

    $url = $url . '?' . $query;

    }

    $ch = curl_init();

    if(stripos($url, "https://") !== false){

    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

    }

    

    curl_setopt($ch, CURLOPT_URL, $url);

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 );

    $content = curl_exec($ch);

    $status = curl_getinfo($ch);

    curl_close($ch);

    if(intval($status["http_code"]) == 200) {

    return $content;

    }else{

    echo $status["http_code"];

    return false;

    }

    }

    

    /*

     * HTTP POST Request

    */

    private  function post_url($url, $params) {

    $ch = curl_init();

    if(stripos($url, "https://") !== false) {

    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

    }

    

    curl_setopt($ch, CURLOPT_URL, $url);

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 );

    curl_setopt($ch, CURLOPT_POST, true);

    curl_setopt($ch, CURLOPT_POSTFIELDS, $params);

    $content = curl_exec($ch);

    $status = curl_getinfo($ch);

    curl_close($ch);

    if(intval($status["http_code"]) == 200) {

    return $content;

    } else {

    return false;

    }

    }

}